package HWtest;
import java.util.*;
public class test2 {
    /**
     * 这个是找最短路径的，给了地图大小，起始位置以及终点位置和陷阱位置
     * 使用dfs进行遍历，使用visited数组保存下标访问情况，将陷阱下标都置为true
     * 遍历时从四个方向开始，传入步数等参数，记录全局最小值
     * 主要是输入的数据处理起来有些麻烦
     */
    static int row;
    static int col;
    static int min;
    static int res;
    static int[][] directions = {{1, 0}, {-1, 0}, {0, 1},{0 ,-1}};
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()){
            String[] t;
            t = sc.nextLine().split(" ");
            row = Integer.parseInt(t[0]);// 行数
            col = Integer.parseInt(t[1]);// 列数
            t = sc.nextLine().split(" ");
            int startX = Integer.parseInt(t[0]);// 开始位置
            int startY = Integer.parseInt(t[1]);
            t = sc.nextLine().split(" ");
            int endX = Integer.parseInt(t[0]);// 结束位置
            int endY = Integer.parseInt(t[1]);
            min = Integer.MAX_VALUE;
            res = 0;
            boolean[][] visited = new boolean[row][col];
            int numOfBarrier = Integer.parseInt(sc.nextLine());// 陷阱位置
            for (int i = 0; i < numOfBarrier; i++){
                t = sc.nextLine().split(" ");
                int x = Integer.parseInt(t[0]);
                int y = Integer.parseInt(t[1]);
                visited[x][y] = true;// 直接置为不可访问
            }
            dfs(0, startX, startY, endX, endY, visited);
            System.out.println(res + " " + min);
        }
    }

    public static void dfs(int step, int x, int y, int endX, int endY, boolean[][] visited){
        if (x == endX && y == endY){// 到达终点了
            if (step < min){
                min = step;
                res = 1;
            }else if (step == min) res++;
        }else {
            visited[x][y] = true;// 当前状态置为不可访问
            for (int[] dir : directions){
                int newX = x + dir[0];
                int newY = y + dir[1];
                if (inGrid(newX, newY) && !visited[newX][newY]){
                    dfs(step + 1, newX, newY, endX, endY, visited);
                }
            }
            visited[x][y] = false;// 恢复状态
        }
    }
    public static boolean inGrid(int x, int y){
        return x >=0 && x < row && y >= 0 && y < col;
    }
}
